package com.cskaoyan.javase.array._1use._2operator;

/**
 * 数组的基本操作
 *
 * @since 11:33
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 动态初始化一个int数组,长度为3
        /*
            arr是一个数组名,在这里,它是一个变量
            是什么变量?
            是一个局部变量,它直接存储在方法栈帧中

            右边使用了"new"关键字
            它表示在堆上创建对象
            所以"="右边表示在堆上创建一个长度为3的int类型数组对象

            于是,一个数组局部变量的创建,实际上要分成两个部分:
                1.在栈上开辟空间,存储数组的"数组名"
                2.在堆上开辟空间,存储数组的对象
            数组是典型的引用数据类型,数组名,也就是引用数据类型变量的变量名
            称之为"引用数据类型的引用",简称"引用"
                于是,局部变量数组:
                 1.在栈上开辟空间存储引用
                 2.在堆上开辟空间存储对象
            以上两个结构,对于数组而言,引用是实质还是对象是实质?
                很明显是对象,数组对象是实质,数组对象用来存储元素
            但是,任何对数组对象的操作,都无法直接进行
            而是必须通过引用间接的进行
            所以引用可以用来操作对应的对象
            为什么引用能操作对象呢?
            说明引用能够访问对象,这就是"="的作用
            引用通过存储堆上对象的地址,来和堆上的对象产生联系
            引用不存任何实际信息,只存对象地址,对象是实质.

            以上就是一个数组局部变量的组成,也就是典型的引用数据类型的组成

         */
        int[] arr = new int[3];

        // 引用中存储地址,直接输出引用会得到这个地址值(这个地址值是经过一系列计算得出的)
        // [I@1540e19d 十六进制的地址值
        System.out.println(arr);

        // 查看数组的长度
        System.out.println(arr.length);
        /*
            访问数组中的元素
            这是一个int数组的动态初始化
            其中的元素具有默认值: 0
            严格来说,这个默认值是JVM给出
            是JVM在创建数组对象时给出的(new关键字)
         */
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        /*
            修改数组对象中元素的取值
            在Java编程语言中
            把修改对象中元素/属性的取值
            称之为"改变对象的状态"
            当然对象中属性/元素的取值不变,就称之为对象的状态不变
          */
        arr[0] = 666;
        arr[1] = 666;
        arr[2] = 666;

        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        // 改变对象的状态,并不会改变对象本身
        System.out.println(arr);
    }
}
